package com.example.d2_reflect;

import org.junit.Test;

import java.lang.reflect.Field;


/**
 * 目标：掌握获取类的成员变量,并对其进行操作
 */
public class Test3Field {
    @Test
    public void testGetFields() throws Exception {
        // 1.反射第一步：必须是先得到类的Class对象
        Class c = Cat.class;

        // 2.获取类的全部成员变量
        // 这种方式可以获取到所有的成员变量不管是不是私有的
        Field[] fields = c.getDeclaredFields();

        // 这种只能获取到public的成员变量,私有的成员变量是获取不到的
        // Field[] fields = c.getFields();

        // 3.遍历这个成员变量数组
        for (Field field : fields) {
            System.out.println(field.getName() + " " + field.getType());
        }

        // 4.定位某个成员变量
        Field fName = c.getDeclaredField("name");
        System.out.println(fName.getName() + " " + fName.getType());

        Field fAge = c.getDeclaredField("age");
        System.out.println(fAge.getName() + " " + fAge.getType());

        // 赋值
        Cat cat = new Cat();
        fName.setAccessible(true);
        // 需要传递两个参数 参数一:要操作的实例对象 参数二：要设置的值
        fName.set(cat, "yu");
        System.out.println(cat);

        // 取值
        String name = (String) fName.get(cat);
        System.out.println(name);
    }
}
